home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 January: Mac OS SDK / Dev.CD Jan 98 SDK1.toast / Development Kits (Disc 1) / QuickDraw 3D / Samples / SampleCode / Skinny3DSample / Skinny3DSources ƒ / Cameras.c < prev    next >
Encoding:
Text File  |  1997-08-14  |  9.5 KB  |  244 lines  |  [TEXT/MPS ]

  1. // File Cameras.c
  2. #include <OSUtils.h>
  3.  
  4. #include    "SkinnyMain.h" // for menu item symbols
  5. #include     "Cameras.h"
  6. /*
  7.     contains:
  8.  
  9. TQ3CameraObject     MakeCamera(long select);
  10. VccPtr             CameraDataToVCC(TQ3CameraObject camera);
  11. void            VCCtoCameraData(VccPtr vcc, TQ3CameraObject camera);
  12.  
  13. */
  14.  
  15. extern    Rect    gContrlRect;
  16.  
  17. static void BasicCameraDataToVCC(TQ3CameraData cameraData, VccPtr vcc);
  18. static void VCCtoBasicCameraData(VccPtr vcc, TQ3CameraData *cameraData);
  19.  
  20.  
  21. //----------------------------------------------------------------------------------
  22. TQ3CameraObject MakeCamera(long select)
  23. {
  24.     TQ3CameraObject                    camera;
  25.     TQ3CameraData                    cameraData;
  26.     TQ3OrthographicCameraData        orthographCameraData;
  27.     TQ3ViewPlaneCameraData            viewPlaneCameraData;
  28.     TQ3ViewAngleAspectCameraData        viewAngleCameraData;
  29.     TQ3Point3D                        cameraFrom = { 0.0, 0.0, 15.0 };
  30.     TQ3Point3D                        cameraTo = { 0.0, 0.0, 0.0 };
  31.     TQ3Vector3D                        cameraUp = { 0.0, 1.0, 0.0 };
  32.     
  33.     cameraData.placement.cameraLocation = cameraFrom;
  34.     cameraData.placement.pointOfInterest = cameraTo;
  35.     cameraData.placement.upVector = cameraUp;
  36.     cameraData.range.hither = .25;
  37.     cameraData.range.yon = 25.0;
  38.     cameraData.viewPort.origin.x = -1.0;
  39.     cameraData.viewPort.origin.y = 1.0;
  40.     cameraData.viewPort.width = 3.0;
  41.     cameraData.viewPort.height = 2.0;
  42.     switch (select) {
  43.         case iOrthoGraphic:
  44.                 orthographCameraData.cameraData = cameraData;
  45.                 orthographCameraData.left = -12.0;
  46.                 orthographCameraData.top = -12.0;
  47.                 orthographCameraData.right = 12.0;
  48.                 orthographCameraData.bottom = 12.0;
  49.                 camera = Q3OrthographicCamera_New(&orthographCameraData);
  50.             break;
  51.             
  52.         case iViewPlane:
  53.                 viewPlaneCameraData.cameraData = cameraData;
  54.                 viewPlaneCameraData.viewPlane = 20.0 ;
  55.                 viewPlaneCameraData.halfWidthAtViewPlane = 20.0;
  56.                 viewPlaneCameraData.halfHeightAtViewPlane = 20.0;
  57.                 viewPlaneCameraData.centerXOnViewPlane = 0.0;
  58.                 viewPlaneCameraData.centerYOnViewPlane = 0.0;
  59.                 camera = Q3ViewPlaneCamera_New(&viewPlaneCameraData);
  60.             break;
  61.             
  62.         case iAspectRatio:
  63.                 viewAngleCameraData.cameraData = cameraData;
  64.                 viewAngleCameraData.fov = 90.0;
  65.                 viewAngleCameraData.aspectRatioXToY = 1.0;
  66.                 camera = Q3ViewAngleAspectCamera_New(&viewAngleCameraData);
  67.             break;
  68.     }
  69.     return ( camera );
  70. }
  71.  
  72.  
  73. //----------------------------------------------------------------------------------
  74. #define cBasicData    20
  75.  
  76. VccPtr     CameraDataToVCC(TQ3CameraObject camera)
  77. {
  78.     TQ3OrthographicCameraData        orthographCameraData;
  79.     TQ3ViewPlaneCameraData            viewPlaneCameraData;
  80.     TQ3ViewAngleAspectCameraData        viewAngleCameraData;
  81.     TQ3ObjectType                    type;
  82.     TQ3Status                        status;
  83.     VccPtr                 vcc;
  84.             
  85.     type = Q3Camera_GetType( camera );
  86.     switch (type) {
  87.         case kQ3CameraTypeOrthographic:
  88.                 status = Q3OrthographicCamera_GetData(camera, &orthographCameraData);
  89.                 if (status == kQ3Failure) return nil;
  90.                 vcc = NewVCluster((long)kQ3CameraTypeOrthographic, 
  91.                                     "\pOrthographicCamera", cBasicData + 4, &gContrlRect);
  92.                 if (vcc == nil) {
  93.                     SysBeep(10); // ErrMsg("\pNewVCluster failed");
  94.                     return nil;
  95.                 }
  96.                 BasicCameraDataToVCC(orthographCameraData.cameraData, vcc);
  97.                 AddValueCtl(vcc, "\pleft", orthographCameraData.left, -20.0, 0.0, 2.0);
  98.                 AddValueCtl(vcc, "\ptop", orthographCameraData.top, -20.0, 0.0, 2.0);
  99.                 AddValueCtl(vcc, "\pright", orthographCameraData.right, 0.0, 20.0, 2.0);
  100.                 AddValueCtl(vcc, "\pbottom", orthographCameraData.bottom, 0.0, 20.0, 2.0);
  101.             break;
  102.             
  103.         case kQ3CameraTypeViewPlane:
  104.                 status = Q3ViewPlaneCamera_GetData(camera, &viewPlaneCameraData);
  105.                 if (status == kQ3Failure) return nil;
  106.                 vcc = NewVCluster((long)kQ3CameraTypeViewPlane, 
  107.                                     "\pViewPlaneCamera", cBasicData + 5, &gContrlRect);
  108.                 if (vcc == nil) {
  109.                     SysBeep(10); // ErrMsg("\pNewVCluster failed");
  110.                     return nil;
  111.                 }
  112.                 BasicCameraDataToVCC(viewPlaneCameraData.cameraData, vcc);
  113.                 
  114.                 AddValueCtl(vcc, "\pviewPlane", viewPlaneCameraData.viewPlane, 5.0, 100.0, 5.0);
  115.                 AddValueCtl(vcc, "\phalfWidthAtViewPlane", viewPlaneCameraData.halfWidthAtViewPlane, 1.0, 39.0, 2.0);
  116.                 AddValueCtl(vcc, "\phalfHeightAtViewPlane", viewPlaneCameraData.halfHeightAtViewPlane, 1.0, 39.0, 2.0);
  117.                 AddValueCtl(vcc, "\pcenterXOnViewPlane", viewPlaneCameraData.centerXOnViewPlane, -5.0, 5.0, 1.0);
  118.                 AddValueCtl(vcc, "\pcenterYOnViewPlane", viewPlaneCameraData.centerYOnViewPlane, -5.0, 5.0, 1.0);
  119.             break;
  120.             
  121.         case kQ3CameraTypeViewAngleAspect:
  122.                 status = Q3ViewAngleAspectCamera_GetData(camera, &viewAngleCameraData);
  123.                 if (status == kQ3Failure) return nil;
  124.                 vcc = NewVCluster((long)kQ3CameraTypeViewAngleAspect,
  125.                                     "\pViewAngleCamera", cBasicData + 2, &gContrlRect);
  126.                 if (vcc == nil) {
  127.                     SysBeep(10); // ErrMsg("\pNewVCluster failed");
  128.                     return nil;
  129.                 }
  130.                 BasicCameraDataToVCC(viewAngleCameraData.cameraData, vcc);
  131.                 
  132.                 AddValueCtl(vcc, "\pviewAngleData.fov", viewAngleCameraData.fov, 0.0, 3.0, 0.1);
  133.                 AddValueCtl(vcc, "\paspectRatioXToY", viewAngleCameraData.aspectRatioXToY, 0.4, 2.5, 0.1);
  134.             break;
  135.     }
  136.     return vcc;
  137. }
  138.  
  139.  
  140. //----------------------------------------------------------------------------------
  141. void VCCtoCameraData(VccPtr vcc, TQ3CameraObject camera)
  142. {
  143.     TQ3OrthographicCameraData        orthographCameraData;
  144.     TQ3ViewPlaneCameraData            viewPlaneCameraData;
  145.     TQ3ViewAngleAspectCameraData        viewAngleCameraData;
  146.     TQ3ObjectType                    type;
  147.     TQ3Status                        status;
  148.  
  149.     type = Q3Camera_GetType( camera );
  150.     switch (type) {
  151.         case kQ3CameraTypeOrthographic:
  152.                 status = Q3OrthographicCamera_GetData(camera, &orthographCameraData);
  153.                 if (status == kQ3Failure) 
  154.                     return;
  155.                 VCCtoBasicCameraData(vcc, &orthographCameraData.cameraData);
  156.                 orthographCameraData.left     = GetCurrentValue(vcc, 20);
  157.                 orthographCameraData.top     = GetCurrentValue(vcc, 21);
  158.                 orthographCameraData.right     = GetCurrentValue(vcc, 22);
  159.                 orthographCameraData.bottom = GetCurrentValue(vcc, 23);
  160.                 status = Q3OrthographicCamera_SetData(camera, &orthographCameraData);
  161.             break;
  162.         case kQ3CameraTypeViewPlane:
  163.                 status = Q3ViewPlaneCamera_GetData(camera, &viewPlaneCameraData);
  164.                 if (status == kQ3Failure)
  165.                     return;
  166.                 VCCtoBasicCameraData(vcc, &viewPlaneCameraData.cameraData);
  167.                 viewPlaneCameraData.viewPlane                 = GetCurrentValue(vcc, 20);
  168.                 viewPlaneCameraData.halfWidthAtViewPlane     = GetCurrentValue(vcc, 21);
  169.                 viewPlaneCameraData.halfHeightAtViewPlane     = GetCurrentValue(vcc, 22);
  170.                 viewPlaneCameraData.centerXOnViewPlane        = GetCurrentValue(vcc, 23);
  171.                 viewPlaneCameraData.centerYOnViewPlane        = GetCurrentValue(vcc, 24);
  172.                 status = Q3ViewPlaneCamera_SetData(camera, &viewPlaneCameraData);
  173.             break;
  174.         case kQ3CameraTypeViewAngleAspect:
  175.                 status = Q3ViewAngleAspectCamera_GetData(camera, &viewAngleCameraData);
  176.                 if (status == kQ3Failure)
  177.                     return;
  178.                 VCCtoBasicCameraData(vcc, &viewAngleCameraData.cameraData);
  179.                 viewAngleCameraData.fov = GetCurrentValue(vcc, 20);
  180.                 viewAngleCameraData.aspectRatioXToY = GetCurrentValue(vcc, 21);
  181.                 status = Q3ViewAngleAspectCamera_SetData(camera, &viewAngleCameraData);
  182.             break;
  183.     }
  184. }
  185.  
  186.  
  187.  
  188. //----------------------------------------------------------------------------------
  189. static void BasicCameraDataToVCC(TQ3CameraData cameraData, VccPtr vcc)
  190. {
  191.     TQ3Point3D     p;
  192.     TQ3Vector3D    pp;
  193.     TQ3Point2D    q;
  194.     
  195.     p = cameraData.placement.cameraLocation;
  196.     AddValueCtl(vcc, "\pcameraLocation.x", p.x, -10.0, 10.0, 0.5); // [0]
  197.     AddValueCtl(vcc, "\pcameraLocation.y", p.y, -10.0, 10.0, 0.5);
  198.     AddValueCtl(vcc, "\pcameraLocation.z", p.z,   0.0, 30.0, 1.0);
  199.     AddSeparator(vcc);
  200.     p = cameraData.placement.pointOfInterest;
  201.     AddValueCtl(vcc, "\ppointOfInterest.x", p.x, -10.0, 10.0, 1.0); // [4]
  202.     AddValueCtl(vcc, "\ppointOfInterest.y", p.y, -10.0, 10.0, 1.0);
  203.     AddValueCtl(vcc, "\ppointOfInterest.z", p.z, -10.0, 10.0, 1.0);
  204.     AddSeparator(vcc);
  205.     pp = cameraData.placement.upVector;
  206.     AddValueCtl(vcc, "\pupVector.x", pp.x, -1.0, 1.0, 0.1); // [8]
  207.     AddValueCtl(vcc, "\pupVector.y", pp.y, -1.0, 1.0, 0.1);
  208.     AddValueCtl(vcc, "\pupVector.z", pp.z, -1.0, 1.0, 0.1);
  209.     AddSeparator(vcc);
  210.     AddValueCtl(vcc, "\prange.hither", cameraData.range.hither, 0.0,  15.0, 1.0); // [12]
  211.     AddValueCtl(vcc, "\prange.yon",    cameraData.range.yon,   15.0, 100.0, 2.5);
  212.     AddSeparator(vcc);
  213.     q = cameraData.viewPort.origin;
  214.     AddValueCtl(vcc, "\pviewPort.origin.x", q.x, -2.0, 2.0, 0.1); // [15]
  215.     AddValueCtl(vcc, "\pviewPort.origin.y", q.y, -2.0, 2.0, 0.1);
  216.     AddValueCtl(vcc, "\pviewPort.width",  cameraData.viewPort.width, 1.0, 10.0, 0.5);
  217.     AddValueCtl(vcc, "\pviewPort.height", cameraData.viewPort.height, 1.0, 10.0, 0.5);
  218.     AddSeparator(vcc); // cBasicData = 20
  219. }
  220.  
  221. //----------------------------------------------------------------------------------
  222. static void VCCtoBasicCameraData(VccPtr vcc, TQ3CameraData *cameraData)
  223. {
  224.     (*cameraData).placement.cameraLocation.x     = GetCurrentValue(vcc, 0);
  225.     (*cameraData).placement.cameraLocation.y     = GetCurrentValue(vcc, 1);
  226.     (*cameraData).placement.cameraLocation.z     = GetCurrentValue(vcc, 2);
  227.  
  228.     (*cameraData).placement.pointOfInterest.x    = GetCurrentValue(vcc, 4);
  229.     (*cameraData).placement.pointOfInterest.y    = GetCurrentValue(vcc, 5);
  230.     (*cameraData).placement.pointOfInterest.z     = GetCurrentValue(vcc, 6);
  231.  
  232.     (*cameraData).placement.upVector.x = GetCurrentValue(vcc, 8);
  233.     (*cameraData).placement.upVector.y = GetCurrentValue(vcc, 9);
  234.     (*cameraData).placement.upVector.z = GetCurrentValue(vcc, 10);
  235.  
  236.     (*cameraData).range.hither     = GetCurrentValue(vcc, 12);
  237.     (*cameraData).range.yon     = GetCurrentValue(vcc, 13);
  238.  
  239.     (*cameraData).viewPort.origin.x = GetCurrentValue(vcc, 15);
  240.     (*cameraData).viewPort.origin.y = GetCurrentValue(vcc, 16);
  241.     (*cameraData).viewPort.width     = GetCurrentValue(vcc, 17);
  242.     (*cameraData).viewPort.height     = GetCurrentValue(vcc, 18);
  243. }
  244.